package com.semac.server.rpc;

import java.sql.SQLException;
import java.util.ArrayList;

import com.semac.client.rpc.PessoaRPCServices;
import com.semac.server.database.classesbase.Database;
import com.semac.server.database.fetchers.PessoaDataFetcher;
import com.semac.shared.exceptions.RPCExceptions;
import com.semac.shared.model.Pessoa;

public class PessoaRPCServicesImpl extends SemacRemoteServiceServlet implements PessoaRPCServices {
	private static final long serialVersionUID = -4963162292506941476L;

	@Override
	public int cadastraPessoa(Pessoa pessoa) throws RPCExceptions {
//		primeiro, verificamos se a pessoa que estao tentando inserir ja nao existe no banco.
		Pessoa pessoaDoBanco = null;
		
		//os replace na string abaixo servem pra dificultar o sql injection
		String whereString = "email='" +  pessoa.getEmail().trim().replace("'", "''") + "'" /*OR " + 
							  "codCartaoUfrgs =" + pessoa.getCartaoUfrgs()*/ ; 
		
		PessoaDataFetcher dataFetcher = new PessoaDataFetcher(whereString);
		
		try {
			Database.getInstance().doSelect(dataFetcher);
			pessoaDoBanco = dataFetcher.getFirstOccurrence();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			throw new RPCExceptions("Oooops! Houve um erro no banco de dados..");
		}
		
		//se algum resultado eh encontrado, aborta insercao
		if (pessoaDoBanco != null)
			throw new RPCExceptions("Este e-mail já foi usado para um registro no site.");
		
		
		
		String fields = "\"nomePessoa\", \"email\", \"senha\", \"codCartaoUfrgs\"";
		String values = "'" + pessoa.getNome().trim().replace("'", "''" ) + "', '" + pessoa.getEmail().trim().replace("'", "''" ) + "', '" + 
						pessoa.getSenha().trim().replace("'", "''" ) + "'," + pessoa.getCartaoUfrgs() ;
		
		if (pessoa.getNome().trim().equals("") || pessoa.getEmail().trim().equals("") || pessoa.getSenha().trim().equals("") )
			throw new RPCExceptions("Erro! campo deixado em branco...");
		
		
		try {
			Database.getInstance().insert("pessoa", fields, values);
		} catch (SQLException e) {
			throw new RPCExceptions("Oooops! Houve erro de inserção no banco..");
		}
		
		
		return 0;
	}

	
	
	@Override
	public ArrayList<Pessoa> getPossiveisMinistrantes() throws RPCExceptions {
		String whereString = "ehComex = 'f' and ehComgrad = 'f'";
		PessoaDataFetcher dataFetcher = new PessoaDataFetcher(whereString);
		
		try {
			Database.getInstance().doSelect(dataFetcher);
		} catch (SQLException e) {
			throw new RPCExceptions("Oooops! Houve erro de select no banco de dados..");
		}
		
		return dataFetcher.getFetchedData();
	}





	@Override
	public int updatePessoa(Pessoa pessoa) throws RPCExceptions {
		String set = "\"nomePessoa\" = '" + pessoa.getNome().trim().replace("'", "''" ) 
					+ "', \"senha\" = '" + pessoa.getSenha().trim().replace("'", "''" ) 
					+ "', \"codCartaoUfrgs\" = " + pessoa.getCartaoUfrgs();
		String where = "\"codPessoa\" = " + pessoa.getIdPessoa();
		
		if (pessoa.getNome().trim().equals("") || pessoa.getSenha().trim().equals("") )
			throw new RPCExceptions("Erro! campo deixado em branco...");
		
		
		try {
			Database.getInstance().update("pessoa", set, where);
		} catch (SQLException e) {
			throw new RPCExceptions("Oooops! Houve erro de inserção no banco..");
		}		
		
		// atualiza pessoa logada na session
		this.setPessoaLogadaNaSession(pessoa);
		return 1;
	}
}
